<?php

use models\Business\AlibabaSku;
use Yaf\Registry;
use models\Business\AlibabaCategory;
use models\Business\AlibabaProduct;
use models\Business\Member;
use models\Business\Coupon;
use models\Exception\Business\MemberException;
use \models\Exception\Business\AlibabaproductException;


class AlibabaController extends ApiBaseController
{
    /**
     * @SWG\Get(
     *     path="/v3/alibabacategory/list",
     *     tags={"1688商品管理"},
     *     summary="获取1688商品分类列表数据接口",
     *     description="
     * page 必须参数 页码
     * page_size 必须参数 每页显示条数
     * sort 必须参数 排序方式 固定值:asc升序
     * order 必须参数 排序字段 固定值:id
     * stats 必须参数 是否显示在app或网站上 固定值:999
     * parent 必须参数 分类编号 传入该参数即可获取指定商品分类下的子类，获取顶级分类时传0。
     *     当返回结果中的publishinng为1时，表示为叶子分类，即可获取商品列表；反之表示还有子类，应继续获取子类",
     *     @SWG\Parameter(
     *          name="Authorization",
     *          description="Authorization 登录接口返回的jwt字段的值",
     *          in="header",
     *          required=false,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="secret",
     *          description="页码",
     *          in="query",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Response(
     *         response="200",
     *         description="请求成功",
     *         @SWG\Schema(type="object", ref="#/definitions/alibabacategoryListData")
     *     ),
     *     @SWG\Response(
     *         response="400",
     *         description="签名不存在或无效签名"
     *     ),
     *     @SWG\Response(
     *         response="401",
     *         description="jwt无效或过期，需要登录"
     *     ),
     *     @SWG\Response(
     *         response="403",
     *         description="无权访问"
     *     ),
     *     @SWG\Response(
     *         response="404",
     *         description="找不到数据"
     *     )
     * )
     */
    public function listAction() {
        $parameters = Registry::get('parameters');

        $category_list = AlibabaCategory::getAlibabaCategoryList($parameters);

        return $this->_responseJson($category_list);
    }

    /**
     * @SWG\Get(
     *     path="/v3/alibabaproduct/list",
     *     tags={"1688商品管理"},
     *     summary="获取1688商品列表数据接口",
     *     description="
     * page 必须参数 页码
     * page_size 必须参数 每页显示条数
     * sort 必须参数 排序方式 可选值:desc降序、asc生序
     * order 必须参数 排序字段 可选值: score综合、created_at发布时间、sales人气、platform_price价格
     * stats 必须参数 是否显示在app或网站上 固定值：1
     * parent 必须参数 上级分类编号 从v3/alibabacategory/list接口返回获取publishing=0的返回结果中的id字段的值
     * category 非必须参数 上级分类 从v3/alibabacategory/list接口返回的publishing=1的记录的id字段的值
     * recommend 非必须参数 是否推荐拼团 可选值: 0为否，1为是。获取推荐拼团时，该参数必须，传1
     * redemption 非必须参数 获取兑换商品时该参数必须，固定值：1",
     *     @SWG\Parameter(
     *          name="Authorization",
     *          description="Authorization 登录接口返回的jwt字段的值",
     *          in="header",
     *          required=false,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="secret",
     *          description="加密字符串",
     *          in="query",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Response(
     *         response="200",
     *         description="请求成功",
     *         @SWG\Schema(type="object", ref="#/definitions/alibabaproductListData")
     *     ),
     *     @SWG\Response(
     *         response="400",
     *         description="签名不存在或无效签名"
     *     ),
     *     @SWG\Response(
     *         response="401",
     *         description="jwt无效或过期，需要登录"
     *     ),
     *     @SWG\Response(
     *         response="403",
     *         description="无权访问"
     *     ),
     *     @SWG\Response(
     *         response="404",
     *         description="找不到数据"
     *     )
     * )
     */
    public function productListAction() {
        $parameters = Registry::get('parameters');

        if (isset($parameters['order']) && in_array($parameters['order'], ['score', 'sales', 'platform_price']))
            $products = AlibabaProduct::getProductByScoreOrSales($parameters);
        else
            $products = AlibabaProduct::getProductList($parameters);

        // 登陆用户访问 记录浏览量
        if (Registry::get('jwt_info')->id)
            AlibabaProduct::updateViews($products);

        return $this->_responseJson($products);
    }

    /**
     * @SWG\Get(
     *     path="/v3/alibabaproduct/{product_id}/info",
     *     tags={"1688商品管理"},
     *     summary="获取1688商品详情接口",
     *     description="
     * timestamp 必须参数 当前时间戳 14位",
     *     @SWG\Parameter(
     *          name="Authorization",
     *          description="Authorization 登录接口返回的jwt字段的值",
     *          in="header",
     *          required=false,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="product_id",
     *          description="/v3/Alibabaproduct/list接口返回的product_id字段的值",
     *          in="path",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="secret",
     *          description="加密字符串",
     *          in="query",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Response(
     *         response="200",
     *         description="请求成功",
     *         @SWG\Schema(type="object", ref="#/definitions/alibabaproductSingleData")
     *     ),
     *     @SWG\Response(
     *         response="400",
     *         description="签名不存在或无效签名"
     *     ),
     *     @SWG\Response(
     *         response="401",
     *         description="jwt无效或过期，需要登录"
     *     ),
     *     @SWG\Response(
     *         response="403",
     *         description="无权访问"
     *     ),
     *     @SWG\Response(
     *         response="404",
     *         description="找不到数据"
     *     )
     * )
     */
    public function infoAction() {
        $parameters = Registry::get('parameters');

        // 读取redis中的数据
        if (false !== $product_in_redis = Registry::get('redis_string')->getString('alibaba_product:' . $parameters['id']))
            $product['data'][] = json_decode($product_in_redis, true);
        // 读取数据库中的数据
        else
            $product = AlibabaProduct::getProduct($parameters);

        // 商品库存不存在sku 就是第一次进入详情页
        if (! isset($product['data'][0]['sku'])) {
            // 查询sku
            $product = AlibabaSku::getSkuByModules($product);
            // 查询商品价格
            $product = AlibabaProduct::getRealPlatformPrice($product);
            // 更新缓存
            $product_cache_name = 'alibaba_product:' . $product['data'][0]['product_id'];
            Registry::get('redis_string')->updateString($product_cache_name, json_encode($product['data'][0]));
        }

        // 处理是否收藏
        $product = Member::getFavoursByProductLists($product);

        // 判断商品状态
        if ($product['data'][0]['stats'] != 1)
            throw new AlibabaproductException(AlibabaproductException::ALIBABAPRODUCT_NOT_EXISTS, AlibabaproductException::ALIBABAPRODUCT_NOT_EXISTS_NO);

        // 足迹
        Member::footprint($product['data'][0]);

        // 检查库存 不存在就生成
        $coupon = new Coupon($product['data'][0]['product_id'], $product['data'][0]['amount_on_sale'], '', '');
        try {
            $coupon->checkStore();
        } catch (\models\Exception\Business\AlibabaproductException $e) {
            // 库存不存在
            $coupon->resetStore();
        }

        $sku_id_store_arr = array_column($product['data'][0]['sku'], 'amount_on_sale', 'sku_id');
        if (! empty($sku_id_store_arr)) {
            foreach ($sku_id_store_arr as $sku_id => $store) {
                // 检查库存 不存在就生成
//                $coupon = new Coupon($product['data'][0]['product_id'], $store, '', $sku_id);
                $coupon->setSkuId($sku_id);
                $coupon->setNum($store);
                try {
                    $coupon->checkStore();
                } catch (\models\Exception\Business\AlibabaproductException $e) {
                    // 库存不存在
                    $coupon->resetStore();
                }
            }
        }

        // 访问商品详情页的用户是一个已登陆用户，查询该商户是否参与了该商品的拼团，且拼团未结束
        if (Registry::get('jwt_info')->jti) {
            // 登录用户 计入点击量
            AlibabaProduct::updateClicks($product['data'][0]);

            try {
                $coupon = new Coupon($parameters['id'], 0, Registry::get('jwt_info')->id, '');

                // 校验当前用户是否允许发起拼团
                $coupon->memberCouponIsValid();
                $product['data'][0]['is_coupon'] = 0;
            } catch (AlibabaproductException $e) {
                if ($e->getMessage() == AlibabaproductException::ALIBABAPRODUCT_TRADE_UNFINISHED)
                    $product['data'][0]['is_coupon'] = 1;
            }
        }

        return $this->_responseJson($product);
    }

    /**
     * @SWG\Get(
     *     path="/v3/alibabaproduct/footprints",
     *     tags={"1688商品管理"},
     *     summary="获取1688商品浏览记录接口",
     *     description="
     * page 必须参数 页码
     * page_size 必须参数 每页显示条数
     * order 必须参数 排序字段 固定值 date
     * sort 必须参数 排序方式 固定值 desc
     * type 非必须参数 商品类型 不存在时表示收藏alibaba商品，存在且为1时表示收藏淘宝客商品
     * date 非必须参数 日期 传空的时候表示获取今天的足迹 格式:YYYY-mm-dd",
     *     @SWG\Parameter(
     *          name="Authorization",
     *          description="Authorization 登录接口返回的jwt字段的值",
     *          in="header",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="secret",
     *          description="加密字符串",
     *          in="query",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Response(
     *         response="200",
     *         description="请求成功",
     *         @SWG\Schema(type="object", ref="#/definitions/alibabacategoryListData")
     *     ),
     *     @SWG\Response(
     *         response="400",
     *         description="签名不存在或无效签名"
     *     ),
     *     @SWG\Response(
     *         response="401",
     *         description="jwt无效或过期，需要登录"
     *     ),
     *     @SWG\Response(
     *         response="403",
     *         description="无权访问"
     *     ),
     *     @SWG\Response(
     *         response="404",
     *         description="找不到数据"
     *     )
     * )
     */
    public function footprintAction() {
        $parameters = Registry::get('parameters');

        $data = Member::getFootprint($parameters);

        return $this->_responseJson($data);
    }

    /**
     * @SWG\Put(
     *     path="/v3/alibabaproduct/{product_id}/favour",
     *     tags={"1688商品管理"},
     *     summary="收藏1688商品接口",
     *     description="
     * type 非必须参数 商品类型 不存在时表示收藏alibaba商品，存在且为1时表示收藏淘宝客商品
     * action 必须参数 favour收藏 cancel取消收藏",
     *     @SWG\Parameter(
     *          name="Authorization",
     *          description="Authorization 登录接口返回的jwt字段的值",
     *          in="header",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="product_id",
     *          description="/v3/Alibabaproduct/list接口返回的product_id字段的值",
     *          in="path",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="secret",
     *          description="加密字符串",
     *          in="formData",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Response(
     *         response="200",
     *         description="请求成功"
     *     ),
     *     @SWG\Response(
     *         response="400",
     *         description="签名不存在或无效签名"
     *     ),
     *     @SWG\Response(
     *         response="401",
     *         description="jwt无效或过期，需要登录"
     *     ),
     *     @SWG\Response(
     *         response="403",
     *         description="无权访问"
     *     ),
     *     @SWG\Response(
     *         response="404",
     *         description="找不到数据"
     *     )
     * )
     */
    public function favourAction() {
        $parameters = Registry::get('parameters');

        if (! in_array($parameters['action'], ['favour', 'cancel']))
            throw new MemberException(MemberException::INVALID_FAVOUR_ACTION, MemberException::INVALID_FAVOUR_ACTION_NO);
        else if ($parameters['action'] == 'cancel') {
            if (! isset($parameters['type']))
                Member::cancelFavourAlibabaProduct($parameters);
            else if (isset($parameters['type']) && $parameters['type'] == 1)
                Member::cancelFavourTbkProduct($parameters);
            $msg = '取消收藏成功';
        } else {
            if (! isset($parameters['type']))
                Member::favourAlibabaProduct($parameters);
            else if (isset($parameters['type']) && $parameters['type'] == 1) {
                Member::favourTbkProduct($parameters);
            }
            $msg = '收藏成功';
        }

        return $this->_responseJson(new stdClass(), '000', $msg);
    }

    /**
     * @SWG\Get(
     *     path="/v3/alibabaproduct/favours",
     *     tags={"1688商品管理"},
     *     summary="获取1688商品收藏列表数据接口",
     *     description="
     * page 必须参数 页码
     * page_size 必须参数 每页显示条数
     * sort 必须参数 排序方式 可选值:desc降序、asc生序
     * order 必须参数 排序字段 固定值: created_at
     * type 非必须参数 商品类型 不存在时表示获取收藏的alibaba商品，存在且为1时表示获取收藏的淘宝客商品",
     *     @SWG\Parameter(
     *          name="Authorization",
     *          description="Authorization 登录接口返回的jwt字段的值",
     *          in="header",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="secret",
     *          description="加密字符串",
     *          in="query",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Response(
     *         response="200",
     *         description="请求成功",
     *         @SWG\Schema(type="object", ref="#/definitions/alibabacategoryListData")
     *     ),
     *     @SWG\Response(
     *         response="400",
     *         description="签名不存在或无效签名"
     *     ),
     *     @SWG\Response(
     *         response="401",
     *         description="jwt无效或过期，需要登录"
     *     ),
     *     @SWG\Response(
     *         response="403",
     *         description="无权访问"
     *     ),
     *     @SWG\Response(
     *         response="404",
     *         description="找不到数据"
     *     )
     * )
     */
    public function favoursAction() {
        $parameters = Registry::get('parameters');

        $product = Member::getFavoursProduct($parameters);

        return $this->_responseJson($product);
    }

    /**
     * @SWG\Get(
     *     path="/v3/alibabaproduct/search",
     *     tags={"1688商品管理"},
     *     summary="1688商品管理搜索接口",
     *     description="
     * page 必须参数 页码
     * page_size 必须参数 每页显示条数
     * sort 必须参数 排序方式 可选值:desc降序、asc生序
     * order 必须参数 排序字段 可选值:product_id
     * keyword 必须参数 搜索关键词 只能为关键词",
     *     @SWG\Parameter(
     *          name="Authorization",
     *          description="Authorization 登录接口返回的jwt字段的值",
     *          in="header",
     *          required=false,
     *          type="string"
     *     ),
     *     @SWG\Parameter(
     *          name="secret",
     *          description="加密字符串",
     *          in="query",
     *          required=true,
     *          type="string"
     *     ),
     *     @SWG\Response(
     *         response="200",
     *         description="请求成功",
     *         @SWG\Schema(type="object", ref="#/definitions/alibabaproductListData")
     *     ),
     *     @SWG\Response(
     *         response="400",
     *         description="签名不存在或无效签名"
     *     ),
     *     @SWG\Response(
     *         response="401",
     *         description="jwt无效或过期，需要登录"
     *     ),
     *     @SWG\Response(
     *         response="403",
     *         description="无权访问"
     *     ),
     *     @SWG\Response(
     *         response="404",
     *         description="找不到数据"
     *     )
     * )
     */
    public function searchAction() {
        $parameters = Registry::get('parameters');

//        $products = AlibabaProduct::getProductList($parameters);
        $products = AlibabaProduct::getProductByScoreOrSales($parameters);

        return $this->_responseJson($products);
    }
}
